#ifndef UPDATEFUNCTIONS_H
#define UPDATEFUNCTIONS_H

#include "AiServiceSettings.h"
#include "Embedding.h"
#include "FileManager.h"
#include "ImageChatService.h"
#include <QObject>
#include <QString>
#include <QTextEdit>

// 内容类型分类的prompt
#define CONTENT_TYPE_PROMPT                                                                                                                      \
    "请根据图片内容将图片进行分类，只返回图片类别无需其他解释，多个类别使用空格分隔。可选的类别为" \
    "：人物 文本 合照 自拍 风景 植物 食物 建筑 动物 电子产品 证件 广告 截图 网页 玩具 家具 其他 "

// 内容描述的prompt
#define CONTENT_DESCRIPTION_PROMPT                                                                                                               \
    "请对这张图片进行详尽的描述。从图片的左上角开始，逐步描述每一个细节，包括但不限于物体的形状、" \
    "颜色、大小、位置以及它们之间的关系。如果有人物，请详细描述他们的外貌、动作和可能的情感。同时" \
    "，尝试描述图片中的光线和阴影如何影响整体的美感和氛围。如果有任何文字或符号，请输出文字内容。" \
    "最后，推测这个场景可能发生的背景故事或情境。"

class UpdateFunctions : public QObject
{
    Q_OBJECT

public:
    explicit UpdateFunctions(QObject *parent = nullptr);

    void setLogOutput(QTextEdit *logOutput);

    void clearAndScanFolder(const QString &folderPath, const QString &knownFacesDir,
                            ImageChatService &imageChatService, Embedding &embedding,
                            AIServiceSettings &aiSettings);
    void appendScanFolder(const QString &folderPath, const QString &knownFacesDir,
                          ImageChatService &imageChatService, Embedding &embedding,
                          AIServiceSettings &aiSettings);

    void recognizeFaces(bool symbol, const QString &knownFacesDir, const QString &checkImagesDir,
                        const QString &outputJsonPath, int cpus = -1, double tolerance = 0.5,
                        bool showDistance = true);
    void updateFaceInfo();
    void updateContentType(ImageChatService &imageChatService, AIServiceSettings &aiSettings);
    void updateContentDescription(ImageChatService &imageChatService,
                                  AIServiceSettings &aiSettings);
    void updateEmbedding(Embedding &embedding, AIServiceSettings &aiSettings);

    // 在 public: 部分添加以下函数声明
    QVector<float> processImageForSearch(const QString &imagePath, const QString &knownFacesDir,
                                         ImageChatService &imageChatService, Embedding &embedding,
                                         AIServiceSettings &aiSettings);

    void rescanFolder(const QString &folderPath, const QString &knownFacesDir,
                      ImageChatService &imageChatService, Embedding &embedding,
                      AIServiceSettings &aiSettings);

private:
    QTextEdit *m_logOutput;

    QString parseContentType(const QString &contentType);
    void log(const QString &message);

    QString formatRemainingTime(qint64 seconds);
};

#endif // UPDATEFUNCTIONS_H
